package br.com.fiap.si;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

import br.com.fiap.si.Beans.Rm;
/**
 * @author Kesley Miranda - Jonantan Sousa - Vitor Ferreira
 * 
 */
public class Grafo {

	private HashMap<Integer, Rm> mapgrafo = new HashMap<>();
	private HashSet<Integer> vertices = new HashSet<>();
	private List<Integer> linha;
	private HashMap<Integer, List<Integer>> arquivo = new HashMap<>();
	
	Grafo(){
	//System.out.println("novo grafo");
	}
	public HashMap<Integer, Rm> getGrafo() {
		listaVertice();
		//System.out.println(vertices.toString());
		constroiMap();
		populaGrafo();
		//System.out.println("novo grafo");
		return this.mapgrafo;

	}

	public void populaGrafo() {

		// roda lista final
		for (Rm rm : mapgrafo.values()) {

//			System.out.println();
//			System.out.print(rm.valor+"-");
			Integer cont = 0;
			for (List<Integer> linha : arquivo.values()) {
				
				for (int i = 0; i < linha.size(); i++) {
					// entra no if se a linha for correspondente a linha do
					// vertice que contem os filhos
					// no else verifica se o vertice possui algum pai e o
					// inclui
					// como uma conexao
					if (linha.get(0) == rm.valor) {
						if (i > 0) {
							rm.rms[cont] = mapgrafo.get(linha.get(i));
							//System.out.print(linha.get(i)+";");
							cont++;
						}
					} else if (i > 0 && linha.get(i) == rm.valor) {
						int aux = 0;
						for(Rm rms : rm.rms){
								if (rms != null) {
							if(rms.valor == linha.get(0))
							aux=1;	
								}
						}
						if (aux==0) {
							rm.rms[cont] = mapgrafo.get(linha.get(0));
							//System.out.print(linha.get(i)+";");
							cont++;
						}
						
					}

				}
			}
		}

	}

	public void constroiMap() {

		for (Integer key : vertices) {

			mapgrafo.put(key, new Rm(key));

		}

	}

	public void listaVertice() {
		try {

			FileReader arq = new FileReader(
					"C:/rm.txt");
			BufferedReader lerArq = new BufferedReader(arq);
			String linha = lerArq.readLine();
			while (linha != null) {
				Integer tmp;
				this.linha = new ArrayList<Integer>();
				if (linha.length() > 0) {
					vertices.add(tmp = Integer.parseInt(linha.substring(0, 5)));
					System.out.println(tmp);
					this.linha.add(tmp);
					if (linha.length() > 11) {
						vertices.add(tmp = Integer.parseInt(linha.substring(6,
								11)));
						this.linha.add(tmp);
						if (linha.length() > 11) {
							vertices.add(tmp = Integer.parseInt(linha
									.substring(12, 17)));
							this.linha.add(tmp);
							if (linha.length() > 17) {
								vertices.add(tmp = Integer.parseInt(linha
										.substring(18, 23)));
								this.linha.add(tmp);
								if (linha.length() > 23) {
									vertices.add(tmp = Integer.parseInt(linha
											.substring(24, 29)));
									this.linha.add(tmp);
									if (linha.length() > 29) {
										vertices.add(tmp = Integer
												.parseInt(linha.substring(30,
														35)));
										this.linha.add(tmp);
									}
								}
							}
						}
					}
					arquivo.put(Integer.parseInt(linha.substring(0,5)), this.linha);
					linha = lerArq.readLine(); 
				}
				
				//System.out.println(linha.toString());
				
			}
			//System.out.println(vertices.toString());
			arq.close();
		} catch (FileNotFoundException e) {
			System.out.println("Arquivo nao encontrado");
			
		}catch (Exception e) {
			System.out.println("formato incorreto de arquivo");
			e.printStackTrace();
		}
	}

	public HashSet<Integer> getVertices() {
		return vertices;
	}

}
